﻿/**
* Отрисовка пунктирной линии
* @author Firsoff Maxim, icq:234859730, firsoff_maxim@mail.ru, tel:+79222345364
* @version 0.1/27.07.2008 18:39
*/

package ru.vega_int.firsoff.as3.utils
{
	import flash.display.CapsStyle;
	import flash.display.Graphics;
	import flash.display.JointStyle;
	import flash.display.LineScaleMode;
	import flash.display.Shape;
	import flash.display.Sprite;
	import flash.geom.Point;

	public class DottedLine extends Sprite
	{
		//	PROPERTIES
		//	public
		public var pixelHinting:Boolean = true;
		//	private
		
		private var _color:uint = 0x000000;
		private var _thickness:Number = 1;
		private var _colorLength:Number = 5;
		private var _emptyLength:Number = 5;
		private var _canvas:Shape;			//	канва для отрисовки
		private var _start:Point;			//	указатель начала
		private var _finish:Point;			//	указатель конца отрисовки
		//	const
		//	----------------------------------------------------------------------------------
		
		//	CONSTRUCTOR
		public function DottedLine() 
		{
			init();
		};
		
		//	METHODS
		//	private
		private function init():void
		{
			_start = new Point();
			_finish = new Point();
			_canvas = new Shape();
			addChild(_canvas);
		};
		
		/**
		 * Отрисовка линии
		 * @param	x
		 * @param	y
		 */
		private function draw() : void
		{
			//	 длина линии в абс. единицах
			var l:Number = Math.sqrt(Math.pow((_finish.x - _start.x), 2) + Math.pow((_finish.y - _start.y), 2));		
			var a:Number = Math.atan((_finish.y - _start.y)/(_finish.x - _start.x));
			_canvas.rotation = a * 180 / Math.PI;
			
			// 	расчитаем колво	периодов
			var n:int = Math.round(l / (_emptyLength + _colorLength + _thickness * 2));
			var g:Graphics = _canvas.graphics;
			var pointer:Number = 0;		//	счетчик длины
			//	если колво периодов больше чем нуль
			if (n)
			{
				g.clear();
				g.lineStyle(_thickness, _color, 1, pixelHinting, LineScaleMode.NORMAL, CapsStyle.SQUARE, JointStyle.MITER, 0);
				while (pointer < l) 
				{
					n--;
					g.moveTo(pointer, 0);
					g.lineTo(pointer + _colorLength, 0);
					pointer = pointer + (_colorLength + _emptyLength + _thickness*2);
				};
			};
		};
		//	public
		
		/**
		 * Установить начальную точку
		 * @param	x
		 * @param	y
		 */
		public function moveTo(x:Number, y:Number):void
		{
			_start.x = x;
			_start.y = y;
		};
		
		/**
		 * Отрисовать линию
		 * @param	x
		 * @param	y
		 */
		public function lineTo(x:Number, y:Number):void
		{
			_finish.x = x;
			_finish.y = y;
			draw();
		};
		
		/**
		 * Стиль линии
		 */
		public function lineStyle(thickness:Number = 1, color:uint = 0, alpha:Number = 1.0, colorLength:Number = 5, emptyLength:Number = 5):void
		{
			if (thickness){_thickness = thickness};
			_color = color;
			this.alpha = alpha;
			if (colorLength){_colorLength = colorLength};
			if (emptyLength){_emptyLength = emptyLength};
		};
		
		//	----------------------------------------------------------------------------------
		
		//	GETTERS/SETTERS
		
		//	----------------------------------------------------------------------------------
		
		//	HANDLERS
		
		//	----------------------------------------------------------------------------------
	};
	
};
